package com.pet.controller;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

//客户端
public class Client {
    static ObjectOutputStream oos;//定义流:对象流
    static ObjectInputStream ois;

    public static void main(String[] args) throws IOException {
        // 客户端：
        // --创建socket套接字，指定端口和ip
        Socket socket = new Socket("127.0.0.1", 8999);
        try {
            //初始化对象流
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
        } catch (IOException exception) {
            exception.printStackTrace();
        }
        //宠物主人登录请求：可以使用一个方法来封装

        menu();

        oos.close();
        ois.close();
        socket.close();
    }

    //主界面
    //客户端中，主人的操作方法类OwnerPart，商店的操作方法PetstorePart
    public static void menu() {
        Scanner sc = new Scanner(System.in);
        try {
            //打印提示信息
            System.out.println("          —————————————U•ェ•*U—————————");
            System.out.println("————————————欢迎来到宠物系统，请选择操作：————————————");
            System.out.println("1、主人登录\t2、商店登录\t3、主人注册\t4、商店注册\t5、退出");
            //获取用户的输入选择
            int option = Integer.parseInt(sc.next());
//            int option = sc.nextInt();
            switch (option) {
                //调用主人登录的方法
                // --宠物主人登录请求：可以使用一个方法来封装
                case 1:
                    System.out.println("欢迎来到宠物主人界面，请选择操作：");
                    Integer o_id = OwnerPart.loginOwner(oos, ois);
                    OwnerMenu(sc, o_id);
                    break;
                //调用商店登录的方法
                case 2:
                    System.out.println("欢迎来到宠物商店界面，请选择操作：");
                    Integer s_id = PetstorePart.loginPetstore(oos, ois);
                    PetStoreMenu(sc, s_id);
                    break;
                //调用主人注册的方法
                case 3:
                    System.out.println("欢迎来到宠物主人注册界面");
                    OwnerPart.registerOwner(oos, ois);
                    menu();
                    break;
                //调用商店注册的方法
                case 4:
                    System.out.println("欢迎来到宠物商店注册界面");
                    PetstorePart.registerPetstore(oos, ois);
                    menu();
                    break;
                case 5:
                    System.exit(0);

                    //如果操作有误
                default:
                    System.out.println("输入不匹配，请重新选择！");
                    //重新回调主菜单方法
                    menu();
            }
        } catch (Exception e) {
            //如果操作有误
            System.out.println("操作有误，请重新操作！");
            //重新回调主菜单方法
            menu();
        }
    }

    //1定义一个宠物主人界面
    public static void OwnerMenu(Scanner sc, Integer o_id) {
        try {
            //打印提示信息
            System.out.println("1、购买宠物\t2、卖出宠物\t3、查看现有宠物\t4、查看个人信息\t5、修改个人信息\t6、查看交易记录\t7、注销\t8、退出登录");
            //获取用户的输入选择
            int option = Integer.parseInt(sc.next());
            switch (option) {
                //主人登录后的方法
                case 1:
                    //主人购买宠物
                    OwnerPart.checkAllPet(oos, ois);
                    System.out.println("请输入你要购买的宠物ID：");
                    int p_id1 = Integer.parseInt(sc.next());
                    boolean res_buy = OwnerPart.ownerBuyPet(o_id, p_id1, oos, ois);
                    if (!res_buy) {
                        System.out.println("不够钱买该宠物啦");
                    }
                    OwnerMenu(sc, o_id);
                    break;
                case 2:
                    //主人卖出宠物
                    boolean res = OwnerPart.checkPet(o_id, oos, ois);
                    if (res) {
                        System.out.println("请输入你要卖出的宠物ID：");
                        int p_id2 = Integer.parseInt(sc.next());
                        OwnerPart.checkAllPetstore(oos, ois);
                        System.out.println("请输入你要卖给的商店ID：");
                        int s_id = Integer.parseInt(sc.next());
                        boolean res_sell = OwnerPart.ownerSellPet(o_id, p_id2, s_id, oos, ois);
                        if (!res_sell) {
                            System.out.println("该商店不够钱买这个宠物了");
                        }
                    }
                    OwnerMenu(sc, o_id);
                    break;
                case 3:
                    //主人查看现有宠物
                    OwnerPart.checkPet(o_id, oos, ois);
                    OwnerMenu(sc, o_id);
                    break;
                case 4:
                    //主人查看信息
                    OwnerPart.checkOwner(o_id, oos, ois);
                    OwnerMenu(sc, o_id);
                    break;
                case 5:
                    //商店修改商店信息
                    System.out.println("请选择要修改的数据：\t1.主人名\t2.密码\t3.财富\t（ID和状态不可随意修改）\t4、返回");
                    int option_Update1 = Integer.parseInt(sc.next());
                    switch (option_Update1) {
                        case 1:
                            updateNameMenu1(sc, o_id);
                            OwnerMenu(sc, o_id);
                        case 2:
                            updatePwMenu1(sc, o_id);
                            OwnerMenu(sc, o_id);
                        case 3:
                            updateWeaMenu1(sc, o_id);
                            OwnerMenu(sc, o_id);
                        case 4:
                            OwnerMenu(sc, o_id);
                        default:
                            System.out.println("输入不匹配，请重新选择！");
                            OwnerMenu(sc, o_id);
                    }
                case 6:
                    //主人查看交易记录
                    OwnerPart.checkAccount(o_id, oos, ois);
                    OwnerMenu(sc, o_id);
                case 7:
                    //主人注销
                    System.out.println("确定要注销吗？1.确定 2.返回");
                    int option_Delete = Integer.parseInt(sc.next());
                    switch (option_Delete) {
                        case 1:
                            OwnerPart.deleteOwner(o_id, oos, ois);
                            menu();
                        case 2:
                            OwnerMenu(sc, o_id);
                    }
                case 8:
                    //主人退出登录（返回主菜单）
                    System.out.println("确定要退出登录（返回主菜单）吗？1.确定 2.返回");
                    int option_Exit = Integer.parseInt(sc.next());
                    switch (option_Exit) {
                        case 1:
                            System.out.println("退出成功");
                            menu();
                        case 2:
                            OwnerMenu(sc, o_id);
                    }
                default:
                    //如果操作有误
                    System.out.println("输入不匹配，请重新选择！");
                    //重新回调主菜单方法
                    OwnerMenu(sc, o_id);
            }
        } catch (Exception e) {
            //如果操作有误
            System.out.println("操作有误，请重新操作！");
            e.printStackTrace();
            //重新回调主菜单方法
//            OwnerMenu(sc);
        }
    }

    //2定义一个宠物商店界面
    public static void PetStoreMenu(Scanner sc, Integer s_id) {
        try {
            //打印提示信息
            System.out.println("1、培育宠物\t2、查看待售宠物\t3、查看商店信息\t4、修改商店信息\t5、查看交易记录\t6、注销\t7、退出登录");
            //获取商店的输入选择
            int option = Integer.parseInt(sc.next());
            switch (option) {
                //商店登录后的方法
                case 1:
                    //商店培育宠物
//                    System.out.println(s_id);
                    PetstorePart.addPet(s_id, oos, ois);
                    System.out.println();//换行
                    PetStoreMenu(sc, s_id);
                    break;
                case 2:
                    //商店查看待售宠物
                    PetstorePart.checkPet(s_id, oos, ois);
                    System.out.println();
                    PetStoreMenu(sc, s_id);
                    break;
                case 3:
                    //商店查看商店信息
                    PetstorePart.checkStore(s_id, oos, ois);
                    System.out.println();
                    PetStoreMenu(sc, s_id);
                case 4:
                    //商店修改商店信息
                    System.out.println("请选择要修改的数据：\t1.商店名\t2.密码\t3.财富\t（ID和状态不可随意修改）");
                    int option_Update2 = Integer.parseInt(sc.next());
                    switch (option_Update2) {
                        case 1:
                            updateNameMenu2(sc, s_id);
                            System.out.println();
                            PetStoreMenu(sc, s_id);
                        case 2:
                            updatePwMenu2(sc, s_id);
                            System.out.println();
                            PetStoreMenu(sc, s_id);
                        case 3:
                            updateWeaMenu2(sc, s_id);
                            System.out.println();
                            PetStoreMenu(sc, s_id);
                        default:
                            System.out.println("输入不匹配，请重新选择！");
                            PetStoreMenu(sc, s_id);
                    }
                case 5:
                    //商店查看交易记录
                    PetstorePart.checkAccount(s_id, oos, ois);
                    System.out.println();
                    PetStoreMenu(sc, s_id);
                case 6:
                    //商店注销登录
                    System.out.println("确定要注销吗？1.确定 2.返回");
                    int option_Delete = Integer.parseInt(sc.next());
                    switch (option_Delete) {
                        case 1:
                            PetstorePart.deleteStore(s_id, oos, ois);
                            menu();
                        case 2:
                            PetStoreMenu(sc, s_id);
                    }
                case 7:
                    //商店退出登录（返回主菜单）
                    System.out.println("确定要退出登录（返回主菜单）吗？1.确定 2.返回");
                    int option_Exit = Integer.parseInt(sc.next());
                    switch (option_Exit) {
                        case 1:
                            System.out.println("退出成功");
                            menu();
                        case 2:
                            PetStoreMenu(sc, s_id);
                    }
                default:
                    //如果操作有误
                    System.out.println("输入不匹配，请重新选择！");
                    //重新回调主菜单方法
                    PetStoreMenu(sc, s_id);
            }
        } catch (Exception e) {
            //如果操作有误
            System.out.println("操作有误，请重新操作！");
            //重新回调主菜单方法
            menu();
        }
    }


    //修改名字界面
    public static void updateNameMenu1(Scanner sc, Integer o_id) {
        try {
            System.out.println("请输入新名字：");
            String name = sc.next();
            OwnerPart.updateOwnerName(o_id, name, oos, ois);

        } catch (Exception e) {
            //如果操作有误
            System.out.println("输入不匹配，请重新选择！");
            //重新回调主菜单方法
            OwnerMenu(sc, o_id);
        }
    }

    //修改密码界面
    public static void updatePwMenu1(Scanner sc, Integer o_id) {
        try {
            System.out.println("请输入新密码：");
            String pw = sc.next();
            OwnerPart.updateOwnerPw(o_id, pw, oos, ois);

        } catch (Exception e) {
            //如果操作有误
            System.out.println("输入不匹配，请重新选择！");
            //重新回调主菜单方法
            OwnerMenu(sc, o_id);
        }
    }

    //修改财富界面
    public static void updateWeaMenu1(Scanner sc, Integer o_id) {
        try {
            System.out.println("请输入新财富：");
            double wea = sc.nextDouble();
            OwnerPart.updateOwnerWea(o_id, wea, oos, ois);

        } catch (Exception e) {
            //如果操作有误
            System.out.println("输入不匹配，请重新选择！");
            //重新回调主菜单方法
            OwnerMenu(sc, o_id);
        }
    }

    //修改名字界面
    public static void updateNameMenu2(Scanner sc, Integer s_id) {
        try {
            System.out.println("请输入新名字：");
            String name = sc.next();
            PetstorePart.updateStoreName(s_id, name, oos, ois);

        } catch (Exception e) {
            //如果操作有误
            System.out.println("操作有误，请重新操作！");
            //如果操作有误
            System.out.println("输入不匹配，请重新选择！");
            //重新回调主菜单方法
            PetStoreMenu(sc, s_id);
        }
    }

    //修改密码界面
    public static void updatePwMenu2(Scanner sc, Integer s_id) {
        try {
            System.out.println("请输入新密码：");
            String pw = sc.next();
            PetstorePart.updateStorePw(s_id, pw, oos, ois);

        } catch (Exception e) {
            //如果操作有误
            System.out.println("输入不匹配，请重新选择！");
            //重新回调主菜单方法
            PetStoreMenu(sc, s_id);
        }
    }

    //修改财富界面
    public static void updateWeaMenu2(Scanner sc, Integer s_id) {
        try {
            System.out.println("请输入新财富：");
            double wea = sc.nextDouble();
            PetstorePart.updateStoreWea(s_id, wea, oos, ois);

        } catch (Exception e) {
            //如果操作有误
            System.out.println("输入不匹配，请重新选择！");
            //重新回调主菜单方法
            PetStoreMenu(sc, s_id);
        }
    }
}